雖遲但到!
下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~
#include <sting.h>
void f(char* s){
char buffer[10];
sttcpy(buffer,s);
}
void main(void){
f("0123456789xyz");
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
char line[ 1048576 ] = {0};
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:
堆疊大小通常是有限的(例如,在Windows下,預設為1 Mb),因此試圖在堆疊上分配過大的緩衝區將導致堆疊溢位,這將導致應用程式崩潰。
把原本程式碼刪掉改成直接宣告line這個空變數(不宣告大小和不賦值),後面判斷直接用if(line!=empty)
解釋:用預設的系統堆疊大小就好,不要試圖改變系統記憶體大小(沒截到就跳掉了qq)
const unsigned maxL = 20;
char value[7][maxL];
sscanf(stringFromFile.c_str(),"%[^_]_%[^_]_%[^_]_%[^_]_%[^_]_%[^_]_%s",
value[0], value[1], value[2], value[3], value[4], value[5], value[6]);
for (unsigned i=0;i<DEFAULT_PARAMS_CNT;++i)
{
trackValues.push_back(value[i]);
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:宣告固定大小的陣列並使用不安全的函式向其寫入資料,為基於堆疊的緩衝區溢位創造了條件。資料可以寫入宣告的陣列之外,還可能導致其程式損壞、失敗或惡意程式碼執行。
一樣把原本程式碼整段刪掉,不要宣告任何限制大小的變數
解釋:
又沒截到qq
return getNextUser( accounts, users );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:可以使用遞歸方法讀取XML節點列表。但如果列表太長,在深度遞迴期間有達到堆疊溢位的危險可能性。
原程式碼段落:
bool getNextUser( std::vector< Account >* accounts, MSXML::IXMLDOMNodeListPtr users )
{
MSXML::IXMLDOMNodePtr user = users->nextNode();
if( user == NULL )
{
return true;
}
Account account;
bool isName = getNodeValue( user, "name", account.name );
bool isLogin = getNodeValue( user, "login", account.login );
bool isPassword = getNodeValue( user, "password", account.password );
if( !isName || !isLogin || !isPassword )
{
return false;
}
accounts->push_back( account );
// Retrieve the next user.
return getNextUser( accounts, users );
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
刪掉,並將以下程式碼
// Retrieve all users.
if( getNextUser( &accounts, users ) == false )
{
return false;
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
修改為:
MSXML::IXMLDOMNodePtr user;
while( ( user = users->nextNode() ) != NULL )
{
Account account;
bool isName = getNodeValue( user, "name", account.name );
bool isLogin = getNodeValue( user, "login", account.login );
bool isPassword = getNodeValue( user, "password", account.password );
if( !isName || !isLogin || !isPassword )
{
return false;
}
accounts.push_back( account );
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:
堆疊溢位通常發生在非常深或無界遞迴的情況下。需要避免深度遞迴呼叫,或應用其他編碼方式來避免可能出現的麻煩。